/**
 *
 */
package kevin.study.zephyr.domain.model.ui;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

import kevin.study.zephyr.domain.model.Entity;
import kevin.study.zephyr.domain.model.Item;


/**
 * @author Kevin.Huang
 * @createtime 2007-9-26
 */
public class UIItem {

	/**
	 * 所要展示的Item
	 */
	private Item item;

	/**
	 * 从实例中取出值并拼接成字符串,用于显示
	 *
	 * @return 拼接出的字符串
	 */
	@SuppressWarnings("unchecked")
	public String getValueBySeparatorForDisplay() {
		String result = "";
		Collection< Entity > entity = item.getEntity();
		if (entity != null && !entity.isEmpty()) {
			for (Entity one : entity) {
				if (result.length() == 0) {
					result = one.toString();
				} else {
					result = result + item.getField().getUiField().getDisplaySeparator() + one.toString();
				}
			}
		}
		return result;
	}

	/**
	 * 输入字符串来输入值根据separator进行分组
	 *
	 * @param value
	 */
	private void setStringValueDivide(String value) {
		Collection< String > values = new ArrayList< String >();
		String[] separator = item.getField().getUiField().getInputSeparator();
		if (separator == null || separator.length == 0) {
			values.add(value);
		} else {
			Collection< String > v = new ArrayList< String >(); // 结果
			v.add(value);
			Collection< String > temp = new ArrayList< String >(); // 临时
			for (String s : separator) {
				for (String r : v) {
					temp.addAll(Arrays.asList(r.split(s)));
				}
				v = temp;
				temp = new ArrayList< String >();
			}
			for (String result : v) {
				values.add(result);
			}
		}
		item.setStringValues(values);
	}

	/**
	 * 输入字符串来输入值,不进行分组
	 *
	 * @param value
	 */
	private void setStringValueSingle(String value) {
		item.setStringValue(value);
	}

	/**
	 * 输入字符串来输入值
	 *
	 * @param value
	 */
	public void setStringValue(String value) {
		if (item.getField().getUiField().getMultivalue()) {
			setStringValueDivide(value);
		} else {
			setStringValueSingle(value);
		}
	}

	/**
	 * @return the item
	 */
	public Item getItem() {
		return item;
	}

	/**
	 * @param item
	 *            the item to set
	 */
	public void setItem(Item item) {
		this.item = item;
	}

}
